/**
  ******************************************************************************
  * @file    ModbusRTU Slave
  * @author  znl
  * @brief   简易的ModbusRTU Slave, 部份代码来自木南创智
  * @email   44399931@qq.com        
  @verbatim
  *
  ******************************************************************************
  */

#ifndef _MB_SLAVE_H_
#define _MB_SLAVE_H_


#include "stdint.h"
#include "mb_pdu.h"
#include "mb_functioncode.h"
#include "mb_datamodel.h"


#define MBS_TIMEROUT 3000 //ms

/**
 * @brief 状态信息
*/
typedef enum 
{
	MBS_STATUS_INIT,                                          
	MBS_STATUS_WAIT_CONN,                            
	MBS_STATUS_CONNED,                        
	MBS_STATUS_BREAKOFF
}MBS_StateTypeDef;

/**
 * @brief 从站模型定义
*/
typedef struct __MB_SLAVE_HandleTypeDef
{
    MBS_StateTypeDef           Status;
    uint32_t                   SlaveTick;
    uint32_t                   LastTick;
    uint32_t                   SlaveID;
    MB_DATAMODEL_HandleTypeDef Regedit; /* 使用时,先给寄存器赋值*/
    //事件
    void (*CycleTimer)(struct __MB_SLAVE_HandleTypeDef *hslave); /** 周期事件, 用于断线检测*/
    void (*ErrorEventCallback)(void);
    void (*StatusChangedEventCallback)(struct __MB_SLAVE_HandleTypeDef *hslave, MBS_StateTypeDef Status);
}MB_SLAVE_HandleTypeDef;

/**
 * @brief 错误响应
 * @param hslave 从站指针
 * @param FunctionCode  功能码
 * @param ExceptionCode 错误码
 * @param pDst 指针, 发送缓冲区
 * @param pDstLen 指针,发送缓冲区长度
 * @ret   VOID
*/
MB_StatusTypeDef MB_SLAVE_ExceptionRsp(
    MB_SLAVE_HandleTypeDef *hslave, 
    uint8_t FunctionCode, uint8_t 
    ExceptionCode, uint8_t *pDst, 
    uint16_t *pDstLen);

/**
 * @brief 从站初始化
 * @param hslave 从站指针
 * @param SlaveID   从站ID
 * @ret   VOID
*/
void MBS_Slave_init(MB_SLAVE_HandleTypeDef *hslave, uint32_t SlaveID);
/**
 * @brief 从站协议入口
 * @param hslave 从站指针
 * @param pSrc   输入数据
 * @param pDst   回复数据
 * @param pDstLen 回复数据长度
 * @ret   MB_OK  正确, MB_ERROR 失败
*/
MB_StatusTypeDef MB_SLAVE_PraseReq(MB_SLAVE_HandleTypeDef *hslave, uint8_t *pSrc, uint8_t *pDst, uint16_t *pDstLen);
#endif

